﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace t1Func
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("求两数之和：{0}",Mymath.Sum(1,2));
            Console.WriteLine("求多个数之和{0}", Mymath.Sum(1,2,3,4,5,6,7,8,9,10));
            Console.WriteLine("求多个数之和{0}",Mymath.Sum(1.0,2.0));

            int[] number = { 1, 2, 3, -1, 5, 6, 100, 8, 9, 10 };
            int? maxIndex = null;//ref必须要有初始值
            int? max = Mymath.Max(number, ref maxIndex);
            Console.WriteLine("最大值为：{0},索引为：{1}",max,maxIndex);
            int? max2 = Mymath.Max(new int[0], ref maxIndex);
            Console.WriteLine("最大值为：{0},索引为：{1}", max2, maxIndex);

           
            int? minIndex;//out可以没有有初始值
            int? min = Mymath.Min(number, out minIndex);
            Console.WriteLine("最小值为：{0},索引为：{1}", min, minIndex);
            int? min2 = Mymath.Max(new int[0], ref minIndex);
            Console.WriteLine("最小值为：{0},索引为：{1}", min2, minIndex);




            Console.ReadKey();
        }
    }
    ///<summary>
    ///自定义数学函数库
    ///<symmary>
    class Mymath
    {
        /// <summary>
        /// 求两数和
        /// </summary>
        /// <param name="a">操作数1</param>
        /// <param name="b">操作数2</param>
        /// <returns>两数之和</returns>
      public static int Sum(int a,int b)
        {
            // int result = 0;
            // result = a + b;
            // return result;
            return a + b;
        }
        /// <summary>
        /// 求多个数的和
        /// </summary>
        /// <param name="values">操作数集合</param>
        /// <returns>多个数的和(可空值)（）params可变长参数列表0或n个</returns>
        public static int? Sum(params int[] values)
        {
            int? result = null;
            if (values.Length > 0)
            {
                result = 0;
                //局部变量可使用var定义变量，类型推断
                foreach (var value in values)
                {
                    result += value;
                }
            }
            return result;

        }
        /// <summary>
        /// 求多个数的和和求更多不同类型数据之和----泛型
        /// </summary>
        /// <param name="values">操作数集合</param>
        /// <returns>多个数的和(可空值)（）params可变长参数列表0或n个</returns>
        public static double? Sum(params double[] values)
        {
            double? result = null;
            if (values.Length > 0)
            {
                result = 0;
                //局部变量可使用var定义变量，类型推断
                foreach (var value in values)
                {
                    result += value;
                }
            }
            return result;

        }

        /// <summary>
        /// 求最大值
        /// </summary>
        /// <param name="values">数据集合</param>
        /// <param name="maxIndex"></param>
        /// <returns>最大值</returns>
        public static int? Max(int[] values,ref int? maxIndex)
        {
            if(values.Length<=0)
            {
                maxIndex = null;
                return null;
            }
            else
            {
                var max = values[0];
                maxIndex = 0;
                for (int i = 0; i < values.Length; i++)
                {
                    if(values[i]>max)
                    {
                        max = values[i];
                        maxIndex = i;
                    }

                }
                return maxIndex;
            }
        }

        /// <summary>
        /// 求最小值
        /// </summary>
        /// <param name="values">数据集合</param>
        /// <param name="minIndex"></param>
        /// <returns>最小值</returns>
        public static int? Min(int[] values, out int? minIndex)
        {
            if (values.Length <= 0)
            {
                minIndex = null;
                return null;
            }
            else
            {
                var min = values[0];
                minIndex = 0;
                for (int i = 0; i < values.Length; i++)
                {
                    if (values[i] <min)
                    {
                        min = values[i];
                        minIndex = i;
                    }

                }
                return minIndex;
            }
        }
    }
}
